//类和对象
package object;

public class Test {
    public int n = 10;//实例属性,分配不同的内存空间,可以有多个不同的值
    static public int m = 100;//类属性,分配同一块内存空间

    //普通的实例方法,可以使用实例属性,也可以使用类属性
    public void func(){
        System.out.println(n);
        System.out.println(m);
    }

    //类方法中只能使用类属性,不能使用实例属性
    public static void staticFunc(){
        Test t1 = new Test();
        System.out.println(t1.n);//这样是可以的,知道n属于哪个实例
//        System.out.println(n);//报错,不能使用,原因时不知道n是属于哪个实例的
        System.out.println(m);
    }

    //普通的实例方法,可以调用其他的实例方法和类方法
    public void func2(){
        func();
        staticFunc();
    }

    //类方法中只能调用类方法,不能调用普通方法
    public static void func3(){
//        func();
        staticFunc();
    }

    //静态代码块,只有在类加载的时候执行一次,一般不用,一般直接就地初始化静态变量
    static {
        //不能访问实例属性,方法

    }

    //构造代码块,每创建一次新的引用变量(创建t1),就会执行一次
    {

    }

    public static void main(String[] args) {
            Test t1 = new Test();
            t1.n = 100;
//            t1.m = 1000;
            //对于类属性,成员变量在一个空间中,故后面新的改变会覆盖前面的
            Test.m = 1000;//可以用Test.进行访问,用t1.本质上还是用Test.进行访问
            Test t2 = new Test();
            t2.n = 200;
            t2.m = 2000;
        System.out.println("t1.m = " + t1.m);//发现t1.m受到了t2.m的影响
        System.out.println("t1.n = " + t1.n);
        System.out.println("t2.m = " + Test.m);
        System.out.println("t2.n = " + t2.n);


    }
}
